package com.coderman.daoclient.service;

import com.coderman.daoclient.bean.KVPair;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * @Author fanchunshuai
 * @Date 2019/10/21 19
 * @Description:
 * 对外开放api接口
 */
public interface IDaoClient<T,I> {


    /**
     * 以对象的方式插入一条记录db
     * @param t
     * @return 当前插入的行记录id
     * @throws Exception 返回-1L or 0L
     */
    Long exeInsert(T t) throws Exception;

    /**
     * 以对象的方式修改记录
     * 默认根据主键id删除
     * @param t
     * @throws Exception
     */
    int exeUpdate(T t) throws Exception;

    /**
     * 以对象的方式修改记录
     * 根据column-value的方式修改
     * @param clazzBean  对象class
     * @param list  修改的列和值
     * @param idPair  id主键的名称和值
     * @throws Exception
     */
    int exeUpdate(Class clazzBean, List<KVPair> list, KVPair idPair)throws Exception;


    /**
     * 以对象的方式修改记录
     * 根据column-value的方式修改
     * @param t
     * @param list
     * @throws Exception
     */
    int exeUpdate(T t, List<KVPair> list)throws Exception;

    /**
     * 以对象的方式删除记录
     * @param clazz
     * @throws Exception
     */
    int exeDelete(Class<?> clazz,I id) throws Exception;

    /**
     * 根据主键id查询记录
     * @param clazz
     * @throws Exception
     */
    <T> T exeQueryTID(Class<?> clazz,I id) throws Exception;


    /**
     * 以对象的方式查询总条数
     * @param clazz
     * @return
     * @throws Exception
     */
    Long exeQueryCount(Class<?> clazz) throws Exception;

    /**
     * 以对象的方式查询总条数
     * @param clazz 要查询的对象
     * @param list 查询参数列表
     * @return
     * @throws Exception
     */
    Long exeQueryCount(Class<?> clazz,List<KVPair> list) throws Exception;


    /**
     * 根据条件查询信息
     * @param clazzBean
     * @param list
     * @param <T>
     * @return
     * @throws Exception
     */
    <T> List<T> getList(Class<T> clazzBean, List<KVPair> list) throws Exception;

    /**
     * 根据sql查询，返回对象列表
     * @param clazzBean
     * @param sql
     * @param <T>
     * @return
     */
    <T> List<T> getList(Class<T> clazzBean,String sql) throws Exception;

    /**
     * 根据两个字段获取map形式的数据结构
     * @param keyColumn
     * @param valueColumn
     * @return
     * @throws Exception
     */
    Map<String,String> getMap(Class<T> clazzBean, String keyColumn, String valueColumn) throws Exception;

    /**
     * 开启事务
     * @throws java.sql.SQLException
     */
    void beginTransaction(int level) throws SQLException;
    /**
     * 开启事务
     * @throws java.sql.SQLException
     */
    void beginTransaction() throws SQLException;


    /**
     * 关闭事务并归还连接到连接池
     * @throws java.sql.SQLException
     */
    void commitTransaction() throws SQLException ;

    /**
     * 关闭事务并归还连接到连接池
     * @throws java.sql.SQLException
     */
    void rollbackTransaction() throws SQLException ;

}
